﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using ProtoGame.GameLib.GameComponents;

namespace ProtoGame.Input
{
    // FIX: Este enum pode ser acessado em qualquer lugar, quando não deveria. No entanto,
    // não é possível restringir o seu acesso sem gerar problemas de compilação. A única
    // solução que encontrei é substituí-lo por uma 'static class' com membros constantes,
    // desfazer a implementação genérica do InputManager, usando 'ushort' como key.
    enum Entradas : byte
    {
        Cima,
        Baixo,
        Esquerda,
        Direita,
        Menu,
        Principal,
        Secundaria
    }

    sealed class PGInput : InputManager<Entradas>, IBasicInput, IPGEntradasAcao
    {
        public PGInput(Game game)
            : base(game)
        {
            TimeSpan periodoAtivaRepeticao = TimeSpan.FromSeconds(1f / 6f);

            AdicionarFuncao(Entradas.Cima, Keys.Up, periodoAtivaRepeticao);
            AdicionarFuncao(Entradas.Baixo, Keys.Down, periodoAtivaRepeticao);
            AdicionarFuncao(Entradas.Esquerda, Keys.Left, periodoAtivaRepeticao);
            AdicionarFuncao(Entradas.Direita, Keys.Right, periodoAtivaRepeticao);
            AdicionarFuncao(Entradas.Menu, Keys.Escape, periodoAtivaRepeticao);
            AdicionarFuncao(Entradas.Principal, Keys.Enter, periodoAtivaRepeticao);
            AdicionarFuncao(Entradas.Secundaria, Keys.Space, periodoAtivaRepeticao);
        }

        #region IBasicInput Members

        public bool Up()
        {
            return FuncaoAtivada(Entradas.Cima);
        }

        public bool Down()
        {
            return FuncaoAtivada(Entradas.Baixo);
        }

        public bool Confirm()
        {
            return FuncaoAtivou(Entradas.Principal);
        }

        public bool Cancel()
        {
            return FuncaoAtivou(Entradas.Menu);
        }

        #endregion

        #region IPGEntradasAcao Members

        public bool AcaoCima()
        {
            return FuncaoSegurando(Entradas.Cima);
        }

        public bool AcaoBaixo()
        {
            return FuncaoSegurando(Entradas.Baixo);
        }

        public bool AcaoEsquerda()
        {
            return FuncaoSegurando(Entradas.Esquerda);
        }

        public bool AcaoDireita()
        {
            return FuncaoSegurando(Entradas.Direita);
        }

        public bool AcaoAtaca()
        {
            return FuncaoAtivou(Entradas.Principal);
        }

        public bool AcaoItem()
        {
            return FuncaoAtivou(Entradas.Secundaria);
        }

        #endregion
    }
}
